WSL2でコマンド実行時に時刻ずれのエラーが発生したときの原因と対処
こんにちは、ゲームソリューション部のsoraです。
今回は、「WSL2でコマンド実行時に時刻ずれのエラーが発生したときの原因と対処」について書いていきます。
発生した事象
Windows10にてWSL2でUbuntuを使用している環境で、Terraformを実行しようとしたときに以下のエラーが発生しました。
$ aws-vault exec [profile名] -- terraform plan aws-vault: error: exec: Failed to get credentials for [profile名]: operation error STS: AssumeRole, https response error StatusCode: 403, RequestID: 8bc101e9-853a-4b33-a415-xxxxxxxxxxxx, api error SignatureDoesNotMatch: Signature expired: 20231005T033420Z is now earlier than 20231005T035503Z (20231005T041003Z - 15 min.)
エラーの内容としては、ワンタイムパスワードを発行した日時より早い時間に実行されているのがおかしいということです。
要するに、WSL2の時刻が実際の時刻とずれていることにより発生しているエラーです。
実際の時刻が13:13あたりのときに、WSL2のシステムクロックを確認してみるとずれていることがわかりました。
$ date Thu Oct 5 12:36:28 JST 2023
原因
WSL2をシャットダウンするなどしなくても、PCをスリープ状態から復帰させたりするとずれが発生するとのことでした。
Hyper-V ドライバ 〜 Hyper-V 〜 Windows の連携が上手くいっていないことから発生するとのことでした。
より詳細なことは以下ページをご確認ください。
WindowsとWSL2の時刻のずれを修正する
対処
対処方法としては色々ありましたが、常に同期が取れている必要がないこと(コマンド実行時だけで良いこと)から、WSL2のRTCからシステムクロックを設定することで解決しました。
# 対処前のシステムクロックの確認 $ date Thu Oct 5 12:36:28 JST 2023 # WSL2のRTCからシステムクロックを設定 $ sudo hwclock -s # もしくは $ sudo hwclock --hctosys # 対処後のシステムクロックの確認 $ date Thu Oct 5 13:13:09 JST 2023
この対処をした後に、最初に実行しようとしたコマンドを実行すると問題なく動作しました。
ちなみにこの対処だと、VM上(WSL2)のハードウェアクロックからシステムクロックへ反映させているだけっぽいので、実際の時刻(ホストマシンのRTC)とは結局ずれている可能性があります。
この件については、申し訳ございませんが、今回の対処で上手くいかなかったときに考えようかなと思います。
また、今回の対処は一時的な対処なので、定期バッチを動かしていたり、常に時刻同期が取れている必要がある場合は、以下が参考になると思います。
WSL2 date incorrect after waking from sleep
最後に
今回は、「WSL2でコマンド実行時に時刻ずれのエラーが発生したときの原因と対処」を記事にしました。
どなたかの参考になると幸いです。